#pragma GCC optimize(2)
#include <iostream>
#include <queue>
#include <map>
#include <unordered_map>
#include <vector>
#include <algorithm>
#include <cmath>
#include <string>
#include <cstring>
#include <set>
#include <unordered_set>
#include <bitset>
#define F first
#define S second
#define IOS ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
const int N=3010;
void solve()
{
	int n=0,k=0;
	cin>>n>>k;
	string s;
	cin>>s;
	
	vector<vector<int> > pre(n+5,vector<int> (k+1));
    vector<vector<int> > suf(n+5,vector<int> (k+1));
	vector<int> sum(n+1);
	
	for(int i=1;i<=n;i++)
	{
		sum[i]=sum[i-1]+(s[i-1]=='1');
	}
	
	for(int i=1;i<=n;i++)
	{
		int cost=0;
		for(int j=i;j<=n;j++)
		{
			cost+=(s[j-1]=='0');
			if(cost<=k)
			{
				pre[j][cost]=max(pre[j][cost],j-i+1);
			}
		}
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=k;j++)
		{
			pre[i][j]=max(pre[i][j],pre[i][j-1]);
		}
		for(int j=0;j<=k;j++)
		{
			pre[i][j]=max(pre[i][j],pre[i-1][j]);
		}
	}
	
	for(int i=n;i>=1;i--)
	{
		int cost=0;
		for(int j=i;j>=1;j--)
		{
			cost+=(s[j-1]=='0');
			if(cost<=k)
			{
				suf[j][cost]=max(suf[j][cost],i-j+1);
			}
		}
	}
	
	for(int i=n;i>=1;i--)
	{
		for(int j=1;j<=k;j++)
		{
			suf[i][j]=max(suf[i][j],suf[i][j-1]);
		}
		for(int j=0;j<=k;j++)
		{
			suf[i][j]=max(suf[i][j],suf[i+1][j]);
		}
	}
	vector<int> f(n+1,-1);
	f[0]=pre[n][k];
	for(int i=1;i<=n;i++)
	{
		
		for(int l=1;l+i-1<=n;l++)
		{
			int r=l+i-1;
			int num=sum[r]-sum[l-1];
			if(num<=k) f[i]=max(f[i],max(pre[l-1][k-num],suf[r+1][k-num]));
		}
	}
	vector<int> ans(n+1);
	for(int i=1;i<=n;i++)
	{
		for(int j=0;j<=n;j++)
		{
			if(f[j]!=-1)
			{
				ans[i]=max(ans[i],i*j+f[j]);
			}
		}
	}
	
	for(int i=1;i<=n;i++) cout<<ans[i]<<' ';
	cout<<endl;
}
int main()
{
	IOS;
	int T=1;
	cin>>T;

	while(T--)
	{
		solve();
	}

	return 0;
}

